home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Common / General Tools / XLongList.cpp < prev    next >
C/C++ Source or Header  |  1999-07-13  |  2KB  |  132 lines

  1. #include "XLongList.h"
  2.  
  3. #include <stdlib.h>
  4.  
  5.  
  6. #define _MIN( a, b ) ( ( (a) < (b) ) ? (a) : (b) )
  7.  
  8. long XLongList::sDummy = 0;
  9.  
  10. XLongList::XLongList( ListOrderingT inOrdering ) :
  11.     mList( inOrdering ) {
  12.  
  13.     if ( inOrdering == cSortLowToHigh || inOrdering == cSortHighToLow )
  14.         mList.SetCompFcn( sLongComparitor, inOrdering == cSortLowToHigh );
  15. }
  16.  
  17.     
  18.  
  19. int XLongList::sLongComparitor( const void* inA, const void* inB ) {
  20.     return ((long) inB - (long) inA);
  21. }
  22.  
  23.  
  24.  
  25. int XLongList::sQSLongComparitor( const void* inA, const void* inB ) {
  26.     return (*((long*) inB) - *((long*) inA));
  27. }
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36. void XLongList::SubtractRange( long inStart, long inEnd ) {
  37.     long x, i = 1;
  38.     
  39.     while ( Fetch( i, &x ) ) {
  40.         if ( x >= inStart && x <= inEnd )
  41.             Remove( x );
  42.         else
  43.             i++;
  44.     }
  45. }
  46.  
  47.  
  48. void XLongList::ApplyMask( long inStart, long inEnd ) {
  49.     long x, i = 1;
  50.     
  51.     while ( Fetch( i, &x ) ) {
  52.         if ( x < inStart || x > inEnd )
  53.             Remove( x );
  54.         else
  55.             i++;
  56.     }
  57. }
  58.  
  59.  
  60.  
  61.  
  62.  
  63. long& XLongList::operator[] ( const long inIndex ) {
  64.     long len;
  65.     
  66.     if ( inIndex >= 0 ) {
  67.         len = mList.mStrLen;
  68.         if ( inIndex >= len >> 2 ) {
  69.             mList.Insert( len, '\0', ( inIndex + 1 ) * 4 - len );
  70.         }
  71.             
  72.         return *( (long*) ( mList.mBuf + inIndex * 4 + 1 ) ); }
  73.     else
  74.         return sDummy;
  75. }
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82. void XLongList::Rank( XLongList& outRank, long inNumToRank ) const {
  83.     long *p, *temp;
  84.     long* srce;
  85.     long i, n = Count();
  86.  
  87.     outRank.RemoveAll();
  88.     
  89.     if ( inNumToRank < 0 )
  90.         inNumToRank = n;
  91.     inNumToRank = _MIN( inNumToRank, n );
  92.     
  93.     // Handle trivial cases of this lis already being sorted
  94.     if ( mList.mOrdering == cSortLowToHigh ) {
  95.         for ( i = 0; i < inNumToRank; i-- ) 
  96.             outRank.Add( n - i ); }
  97.             
  98.     // Duh... still sorted...
  99.     else if ( mList.mOrdering == cSortHighToLow ) {
  100.         for ( i = 1; i <= inNumToRank; i++ ) 
  101.             outRank.Add( i ); }    
  102.             
  103.     else {
  104.         temp = new long[ 2 * n ];
  105.         srce = (long*) mList.getCStr();
  106.         
  107.         // To rank, we must sort, with a tag on each element saying where it came from
  108.         p = temp;
  109.         for ( i = 1; i <= n; i++ ) {
  110.             *p = *srce;
  111.             p++;  srce++;
  112.             *p = i;
  113.             p++;
  114.         }
  115.         
  116.         // Sort the floats
  117.         qsort( temp, n, 8, sQSLongComparitor );
  118.         
  119.         // Put the sorted results in the destination
  120.         p = temp + 1;
  121.         for ( i = 0; i < inNumToRank; i++ ) {
  122.             outRank.Add( *p );
  123.             p += 2;
  124.         }
  125.         
  126.         // Cleanup
  127.         delete []temp;
  128.     }
  129. }
  130.  
  131.             
  132.